package cn.tedu.ttl.common.response;

//Swagger注解库，用于对类的属性进行注释描述。提供了一些元数据，用于生成API文档。
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@AllArgsConstructor//Lombok注解，自动生成包含所有构造参数的全参构造函数
@NoArgsConstructor//Lombok注解，自动生成一个无参构造函数
public class JsonResult<T> {//声明一个泛型类JsonResult，用于表示通用的JSON响应


    //ApiModelProperty(value="XXX")
    //Swagger提供的注解，用于描述属性的含义，这些注解将会被Swagger解析，生成相应的API文档
    @ApiModelProperty("状态码")
    private Integer code;

    @ApiModelProperty("消息提示")
    private String msg;

    private T data;


    //第1个构造方法：只封装状态码和提示消息,针对于不需要返回具体数据的这一类控制器方法[功能]
    public JsonResult(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    //第2个构造方法：用于Controller中不需要返回具体数据的方法[使用自定义枚举类]
    public JsonResult(StatusCode statusCode){
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
    }

    //第3个构造方法：用于Controller中需要返回具体数据的方法[使用自定义枚举类]
    public JsonResult(StatusCode statusCode, T data){
        this(statusCode);
//        this.code = statusCode.getCode();
//        this.msg = statusCode.getMsg();
        this.data = data;
    }

    //第4个构造方法：用于快速构建JsonResult对象[操作成功的业务场景]
    public JsonResult(T data){
        this.code = StatusCode.SUCCESS.getCode();
        this.msg = StatusCode.SUCCESS.getMsg();
        this.data = data;
    }

    //静态方法1：构建有具体数据返回的JsonResult对象 针对于操作成功的业务场景
    public static JsonResult ok(Object data){
        return new JsonResult(data);
    }

    //静态方法2：构建没有具体数据返回的JsonResult对象 针对于操作成功的业务场景
    public static JsonResult ok(){
        return ok(null);
    }



}
